// 目标: 封装接口请求方法
// request是request.js里封装自定义函数
import request from '@/utils/request'
// vuex在内存中, 浏览器本地在磁盘上

// 经验: 函数内自己确定不了的值, 让外面传入
/**
 * 登录接口
 * @param {*} param0 { mobile: 手机号, code: 验证码 }
 * @returns Promise对象
 */
export const loginAPI = ({ mobile, code }) => {
  // 知识点: axios的data选项如果是一个JS对象,axios内部会帮你转成JSON字符串
  return request({
    url: '/v1_0/authorizations',
    method: 'POST',
    data: {
      mobile: mobile,
      code: code
    }
  })
}

/**
 * 获取-所有频道
 * @returns Promise对象
 */
export const getAllChannelListAPI = () => {
  return request({
    url: '/v1_0/channels'
  })
}

/**
 * 获取-用户已选频道
 * @returns Promise对象
 */
export const getUsersChannelListAPI = () => {
  return request({
    url: '/v1_0/user/channels'
  })
}

/**
 * 更新-用户选择频道列表
 * @param {*} param0 { channels: 频道列表 }
 * @returns Promise对象
 */
export const uploadUserChannelAPI = ({ channels }) => request({
  url: '/v1_0/user/channels',
  method: 'PUT', // 全部更新
  data: {
    channels
  }
})

/**
 * 获取-所有文章列表
 * @param {*} param0 { channel_id: 频道id, timestamp: 时间戳.上一段数据最后一个文章的时间戳, 用于请求下一页数据 }
 * @returns Promise对象
 */
export const getArticleListAPI = ({ channel_id, timestamp }) => {
  return request({
    url: '/v1_0/articles',
    params: {
      channel_id,
      timestamp
    }
  })
}

/**
 * 反馈-不感兴趣
 * @param {*} artId 文章id
 * @returns Promise对象
 */
export const articleDislikeAPI = (artId) => {
  return request({
    url: '/v1_0/article/dislikes',
    method: 'POST',
    data: {
      target: artId
    }
  })
}

/**
 * 举报文章
 * @param {*} param0 { artId: 文章id, type: 举报类型数字, remark: 其他问题说明 }
 * @returns Promise对象
 */
export const reportArticleAPI = ({ artId, type, remark }) => {
  // 自己组织参数对象
  const dataObj = {
    target: artId,
    type
  }
  // 只有type类型值为0(其他问题), 才需要携带remark参数
  if (type === 0) {
    dataObj.remark = remark
  }

  return request({
    url: '/v1_0/article/reports',
    method: 'POST',

    data: dataObj
  })
}

// 获取-联想建议菜单
export const getSuggestListAPI = ({ keywords }) => {
  return request({
    url: '/v1_0/suggestion',
    params: {
      q: keywords
    }
  })
}

// 获取-搜索结果列表
export const getSearchResultListAPI = ({ page, per_page, q }) => {
  return request({
    url: '/v1_0/search',
    params: {
      page,
      per_page,
      q
    }
  })
}

// 获取-文章详情
export const getArticleDetailAPI = ({ artId }) => request({
  url: `/v1_0/articles/${artId}`
})

// 文章 - 关注作者
export const followedUserAPI = ({ target }) => {
  return request({
    url: '/v1_0/user/followings',
    method: 'POST',
    data: {
      target: target
    }
  })
}
// 文章 - 取消关注作者
export const unFollowedUserAPI = ({ uid }) => {
  return request({
    // 这uid只是个变量名, 把值拼接在url发给后台(无需指定参数名)
    url: `/v1_0/user/followings/${uid}`,
    method: 'DELETE'
  })
}

// 文章 - 点赞
export const articleLikeAPI = ({ target }) => {
  return request({
    url: '/v1_0/article/likings',
    method: 'POST',
    data: {
      target: target
    }
  })
}

// 文章 - 取消点赞
export const articleDisLikeAPI = ({ artId }) => {
  return request({
    url: `/v1_0/article/likings/${artId}`,
    method: 'DELETE'
  })
}

// 获取-文章评论列表
// 知识点1: 对象解构失败(传过来的对象里没有offset和limit属性-因为可选的, offset和limit变量的值就为=后面的值, 如果外面传入就不用=后面默认值了)
// 知识点2: axios只针对params选项的值做了判断, 如果你传递的参数值为null, axios会忽略掉这个参数不在url?后面携带
export const getArticleCommentListAPI = ({ artId, offset = null, limit = 10 }) => request({
  url: '/v1_0/comments',
  params: {
    type: 'a',
    source: artId,
    offset,
    limit
  }
})

// 评论 - 喜欢
export const commentLikingAPI = ({ comId }) => {
  return request({
    url: '/v1_0/comment/likings',
    method: 'POST',
    data: {
      target: comId
    }
  })
}
// 评论-取消喜欢
export const commentDisLikingAPI = ({ comId }) => {
  return request({
    url: `/v1_0/comment/likings/${comId}`,
    method: 'DELETE'
  })
}

// 对-文章进行评论
export const sendCommentAPI = ({ artId, content }) => request({
  url: '/v1_0/comments',
  method: 'POST',
  data: {
    target: artId,
    content: content
  }
})

// 获取-用户个人信息(包含发表文章数量和粉丝数量等)
export const getUserInfoAPI = () => {
  return request({
    url: '/v1_0/user'
  })
}

// 获取-用户个人简介
export const getUserProfileAPI = () => {
  return request({
    url: '/v1_0/user/profile'
  })
}

// 更新-用户头像
export const uploadUserPhotoAPI = (fd) => {
  return request({
    url: '/v1_0/user/photo',
    method: 'PATCH', // 更新后端的部分数据
    data: fd // 如果你传入的{}对象, axios内部会转成JSON字符串(但是本接口请求体要的是一个FormData表单数据对象)
    // axios内部会判断data参数值的类型, 如果是FormData它会直接携带给服务器, 浏览器帮我们添加请求头Content-Type内容类型并携带分隔符(看network此次请求)
  })
}

// null和undefined是有区别的
// 更新-用户信息
export const patchUserProfileAPI = ({ name = '', gender = 0, birthday = '', real_name = '', intro = '' }) => {
  // 只有params参数, axios内部会判断值为null时, 不会携带此参数名和值给后台
  // 我改某个字段的值, 其他字段不能传递, 如果传了就改了个空的生日
  // 解决:
  const dataObj = {
    name,
    gender,
    birthday,
    real_name,
    intro
  }
  const newObj = {}
  // 遍历dataObj里每对key+value, 有值才放到newObj
  for (const key in dataObj) {
    if (dataObj[key]) {
      // 有值, 就添加到newObj身上
      newObj[key] = dataObj[key]
    }
  }

  return request({
    url: '/v1_0/user/profile',
    method: 'PATCh',
    data: newObj
  })
}
